using System;
using System.Collections.Generic;
using System.Text;
using Ksibo.Modelo;
using NHibernate;
using NHibernate.Expression;
using NHibernate.Cfg;

namespace Ksibo.Dados
{
    public class MensagemBD
    {
        public static ISession conexaoMsg;
        private static ITransaction transacaoMsg;

        public static IList<Mensagem> BuscaMensagensPorExpressoes(params SimpleExpression[] exp)
        {
            try
            {
                ConectaEmMensagens();                
                ICriteria crit = conexaoMsg.CreateCriteria(typeof(Mensagem));
                foreach (SimpleExpression expressao in exp)
                {
                    crit.Add(expressao);
                }
                IList<Mensagem> retorno = crit.List<Mensagem>();
                DesconectaDeMensagens(Definicoes.TRANSACAO_SEM_ERRO);
                return retorno;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                DesconectaDeMensagens(Definicoes.TRANSACAO_COM_ERRO);
                return null;
            }
        }
        public static bool ApagaMensagem(Mensagem msg)
        {
            try
            {
                ConectaEmMensagens();
                conexaoMsg.Delete(msg);
                conexaoMsg.Flush();
                DesconectaDeMensagens(Definicoes.TRANSACAO_SEM_ERRO);
                return true;
            }
            catch (Exception exp)
            {
                Console.WriteLine(exp.ToString());
                DesconectaDeMensagens(Definicoes.TRANSACAO_COM_ERRO);
                return false;
            }
        }

        public static bool AtualizaMensagem(Mensagem msg)
        {
            try
            {
                ConectaEmMensagens();
                conexaoMsg.Update(msg);
                DesconectaDeMensagens(Definicoes.TRANSACAO_SEM_ERRO);
                return true;
            }
            catch (Exception exp)
            {
                Console.WriteLine(exp.ToString());
                DesconectaDeMensagens(Definicoes.TRANSACAO_COM_ERRO);
                return false;
            }
        }
        public static bool MandaMensagem(Mensagem msg)
        {
            try
            {
                ConectaEmMensagens();
                conexaoMsg.Save(msg);
                DesconectaDeMensagens(Definicoes.TRANSACAO_SEM_ERRO);
                return true;
            }
            catch (Exception exp)
            {
                Console.WriteLine(exp.ToString());
                DesconectaDeMensagens(Definicoes.TRANSACAO_COM_ERRO);
                return false;
            }
        }
        public static bool AtualizaListaMensagem(IList<Mensagem> mensagens)
        {
            try
            {
                ConectaEmMensagens();
                foreach (Mensagem msg in mensagens)
                {
                    conexaoMsg.Save(msg);
                }
                DesconectaDeMensagens(Definicoes.TRANSACAO_SEM_ERRO);
                return true;
            }
            catch (Exception exp)
            {
                Console.WriteLine(exp.ToString());
                DesconectaDeMensagens(Definicoes.TRANSACAO_COM_ERRO);
                return false;
            }
        }
        private static void ConectaEmMensagens()
        {
            try
            {
                if (conexaoMsg == null || !conexaoMsg.IsOpen)
                {
                    Configuration cfg = new Configuration();
                    cfg.AddAssembly("Ksibo");
                    ISessionFactory factory = cfg.BuildSessionFactory();
                    conexaoMsg = factory.OpenSession();
                }
                else if (!conexaoMsg.IsConnected)
                {
                    conexaoMsg.Reconnect();
                }
                transacaoMsg = conexaoMsg.BeginTransaction();
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }
        private static void DesconectaDeMensagens(bool ocorreuErro)
        {
            try
            {
                if (ocorreuErro)
                {
                    transacaoMsg.Rollback();
                    conexaoMsg.Disconnect();
                }
                else
                {                    
                    transacaoMsg.Commit();
                    conexaoMsg.Disconnect();
                }
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }
    }
}
